With current graphics engines resource allocation is not optimized for individual use cases, they essentially use pool memory which is use-case independent. For example, in an entertainment graphics engine some resources can be permanently allocated for rendering explosions regardless if there are any explosions in a given rendering set. As such, these resources may go to waste during large portions of gaming use and virtually always in, for example, industrial uses.
Additionally, current engines often hide their resource allocation so that it's hard to determine if certain operations results in new allocations.
Furthermore, to avoid having combinatorial explosion between algorithms configurations, certain resources are redundantly allocated. For example, one algorithm might need some temporary texture for intermediate results, but the texture is not needed after the algorithm completes, however, the texture is then kept just for that algorithm and is not accessible for other portions of the rendering pipeline thereby needlessly using system memory resources. Therefore, in current graphics engines this texture cannot be reused in a later stage or a different stage of the rendering pipeline.
A major problem created by current graphics engines system resource allocation is a high degree of memory fragmentation. Due to this, and on many other well known reasons in the art, current graphics engines are not well suited for safety critical environments.
Furthermore, Graphics Processing Units (GPUs) often have a problem where rendering processes and computing processes fight for the same resources. When this happens there can arise a block or inefficiencies where one or both sets of processes are unnecessarily slowed down. Therefore, there exists a need for balancing the work load in a GPU between rendering tasks and computing tasks.